﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Loja.Banco;
using Loja.Controles.Dados;
using Loja.Controles.Aplicação;
using System.Windows.Forms;
using System.Data.Objects;

namespace Loja.Aplicação
{
    class ProdutoControle
    {    
        public LOJA banco { get; set; }

        public ProdutoControle(LOJA banco)
        {
            this.banco = banco;
        }
        
        public void Salvar(Produto produto)
        {
            //banco.AddObject("Produto", produto);
            banco.AddToProduto(produto);            
            banco.SaveChanges();            
        }
        /*
        public IEnumerable<Produto> Listar()
        {
            return banco.Produto.ToList();
        }
        */

        public Object Listar()
        {
            var produtoListar = (from x in banco.Produto.Include("CodigoBarras")
                                 where x.Desativado.Equals(false)
                                 select x).ToList();

            return (Object) produtoListar;
        }

        public Object BuscarProdutoCampo(String campo)
        {
            var produtoBuscar = (from x in banco.Produto.Include("CodigoBarras")
                                     where x.Descricao.Contains(campo)
                                     && x.Desativado.Equals(false)
                                     select x).ToList();
            return (Object)produtoBuscar;
        }

        public void Alterar(Produto produto)
        {
           banco.SaveChanges();
        }

        public void AlterarBarras()
        {
            banco.SaveChanges();
        }

        public void Excluir(Object produto)
        {
            Produto produtoExcluir = (from x in banco.Produto
                                      where x.Produto_ID.Equals(produto)//alterado 29/10/2012
                                      && x.Desativado.Equals(false)
                                      select x).First();

            produtoExcluir.Desativado = false;

            banco.AddToProduto(produtoExcluir);
            banco.SaveChanges();
        }

        public Produto Buscar(Produto produto)
        {
            Produto produtoBuscar = (from x in banco.Produto
                                     where x.Produto_ID == produto.Produto_ID
                                     && x.Desativado.Equals(false)
                                     select x).First();
            return produtoBuscar;
        }

        public Produto BuscarCodigo(String codigo)
        {
            Int32 vai = 0;
            Produto produto = new Produto();
            produto.Produto_ID = 0;

            var produtoBuscar = (from x in banco.Produto
                                 join a in banco.CodigoBarras on x.Produto_ID equals a.Produto.Produto_ID
                                     where a.Codigo == codigo 
                                     && x.Desativado.Equals(false)
                                     && a.Desativado == false
                                     select x);

            foreach (var i in produtoBuscar) 
            {
                if (i.Produto_ID > 0)                
                    vai = 1;                              
            }

            if (vai == 1)
                return produtoBuscar.First();
            else
                return produto;
        }

        public Produto Buscar(Int32 produto)
        {
            Produto produtoBuscar = (from x in banco.Produto
                                     where x.Produto_ID == produto
                                     && x.Desativado.Equals(false)
                                     select x).First();
            return produtoBuscar;

        }


        public CodigoBarras BuscarCodigo(Int32 produto)
        {
            CodigoBarras codigoBuscar = (from x in banco.CodigoBarras
                                    join a in banco.Produto on x.Produto.Produto_ID equals a.Produto_ID
                                     where a.Produto_ID == produto
                                     && a.Desativado.Equals(false)
                                     select x).First();
            return codigoBuscar;

        }

        public CodigoBarras BuscarBarras(String codigo)
        {
            CodigoBarras codigoBuscar = (from x in banco.CodigoBarras
                                     where x.Codigo == codigo
                                       && x.Desativado == false
                                     select x).First();
            return codigoBuscar;

        }

        public Produto BuscarProdutoCodigo(Int32 produto)
        {
            Produto produtoBuscar = (from p in banco.Produto                                                          
                                 where p.Produto_ID == produto
                                 && p.Desativado.Equals(false)
                                     select p).First();

            produtoBuscar.TipoProduto = (from p in banco.Produto
                             join c in banco.TipoProduto on p.TipoProduto.TipoProduto_ID equals c.TipoProduto_ID
                             where p.Produto_ID == produto
                             && p.Desativado.Equals(false)
                             select c).First();



            return produtoBuscar;
        }

        public List<CodigoBarras> ListaBarras(Int32 codigo)
        {
            var codigoBuscar = (from x in banco.CodigoBarras
                                where x.Produto.Produto_ID.Equals(codigo)
                                && x.Desativado == false
                                select x).ToList();

            return (List<CodigoBarras>)codigoBuscar;

        }

        public Boolean ExiteBarras(String codigo)
        {
            Int32 valida = (from x in banco.CodigoBarras
                            where x.Codigo == codigo && x.Desativado == false
                            select x).Count();

            if (valida == 0)
                return true;
            else
                return false;
        }
        public void SalvarBarras(CodigoBarras novoCodigo)
        {
            banco.AddToCodigoBarras(novoCodigo);
            banco.SaveChanges();
        }


        public String BuscaNomeProduto(String codigo)
        {
            String nome = (from p in banco.Produto
                           join c in banco.CodigoBarras on p.Produto_ID equals c.Produto.Produto_ID
                           where c.Codigo == codigo && p.Desativado == false
                           select p.Descricao).First().ToString();
                
            return nome;
        }

        public List<vw_AlertaEstoque> AlertaEstoque()
        {
            var produto = (from x in banco.vw_AlertaEstoque
                                        select x).ToList();            

            return produto;
        }


        public Object ListaProdutosConsulta()
        {
            var lista = (from p in banco.Produto
                         join c in banco.CodigoBarras on p.Produto_ID equals c.Produto.Produto_ID
                         where c.Desativado == false && p.Desativado == false 
                         select new 
                         {
                             CodigoBarras = c.Codigo,
                             Produto = p.Descricao + " " + c.Unidade,
                             Valor = c.Valor 
                         }).ToList();

            return lista;
        }

        public Object ListaProdutosPorNome(String nome)
        {
            var lista = (from p in banco.Produto
                         join c in banco.CodigoBarras on p.Produto_ID equals c.Produto.Produto_ID
                         where c.Desativado == false && p.Desativado == false && (p.Descricao +" "+ c.Unidade).Contains(nome)
                         select new
                         {
                             CodigoBarras = c.Codigo,
                             Produto = p.Descricao + " " + c.Unidade,
                             Valor = c.Valor
                         }).ToList();
           
            return lista;
        }

        public Object ListaProdutosPorCodigo(String codigo)
        {            
            var lista = (from p in banco.Produto
                         join c in banco.CodigoBarras on p.Produto_ID equals c.Produto.Produto_ID
                         where c.Desativado == false && p.Desativado == false && c.Codigo.Contains(codigo)
                         select new
                         {
                             CodigoBarras = c.Codigo,
                             Produto = p.Descricao + " " + c.Unidade,
                             Valor = c.Valor
                         }).ToList();
            return lista;
        }

        public Produto BuscaProdutoCompra(Int32 codigo)
        {
            Produto produto = (from p in banco.Produto                         
                         where p.Desativado == false && p.Produto_ID == codigo
                         select p).First();
            return produto;
        }
    }
}